From: Colin Leroy Date: Tue, 12 Sep 2017 13:32:36 +0000 (+0200) Subject: placesview: Present FUSE-reachable network shares in Other Locations X-Git-Tag: archive/raspbian/3.24.39-1+rpi1~1^2~65^2~38^2~133 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success/%22http:/www.example.com/cgi/success?a=commitdiff_plain;h=279b81d20211c301ce5ba6678a398db483a17409;p=gtk%2B3.0.git placesview: Present FUSE-reachable network shares in Other Locations The documentation about gtk_file_chooser_set_local_only() states that "non-native files may still be available using the native filesystem via a userspace filesystem (FUSE)." The code that made this possible in GTK+2 was missing from GTK+3 and that represented a regression for Linux users in numerous applications (Firefox, Thunderbird, Chromium, ...) https://bugzilla.gnome.org/show_bug.cgi?id=787128 --- diff --git a/gtk/gtkplacesview.c b/gtk/gtkplacesview.c index bb10b59b86..f8a2e22c6f 100644 --- a/gtk/gtkplacesview.c +++ b/gtk/gtkplacesview.c @@ -1183,8 +1183,7 @@ update_places (GtkPlacesView *view) populate_servers (view); /* fetch networks and add them asynchronously */ - if (!gtk_places_view_get_local_only (view)) - fetch_networks (view); + fetch_networks (view); update_view_mode (view); /* Check whether we still are in a loading state */ @@ -1904,6 +1903,30 @@ on_listbox_row_activated (GtkPlacesView *view, activate_row (view, row, priv->current_open_flags); } +static gboolean +is_mount_locally_accessible (GMount *mount) +{ + GFile *base_file; + gchar *path; + + if (mount == NULL) + return FALSE; + + base_file = g_mount_get_root (mount); + + if (base_file == NULL) + return FALSE; + + path = g_file_get_path (base_file); + g_object_unref (base_file); + + if (path == NULL) + return FALSE; + + g_free (path); + return TRUE; +} + static gboolean listbox_filter_func (GtkListBoxRow *row, gpointer user_data) @@ -1911,6 +1934,7 @@ listbox_filter_func (GtkListBoxRow *row, GtkPlacesViewPrivate *priv; gboolean is_network; gboolean is_placeholder; + gboolean is_local = FALSE; gboolean retval; gboolean searching; gchar *name; @@ -1923,7 +1947,20 @@ listbox_filter_func (GtkListBoxRow *row, is_network = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (row), "is-network")); is_placeholder = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (row), "is-placeholder")); - if (is_network && priv->local_only) + if (GTK_IS_PLACES_VIEW_ROW (row)) + { + GtkPlacesViewRow *placesviewrow; + GMount *mount; + + placesviewrow = GTK_PLACES_VIEW_ROW (row); + g_object_get(G_OBJECT (placesviewrow), "mount", &mount, NULL); + + is_local = is_mount_locally_accessible (mount); + + g_clear_object (&mount); + } + + if (is_network && priv->local_only && !is_local) return FALSE; if (is_placeholder && searching)